﻿/*
 * 2023/4/4
 * 购物车
 * 
 * **/
using Max.Ph5_2009A.NewShopping.DTO;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace Max.Ph5_2009A.NewShopping.API.Controllers
{
    /// <summary>
    /// 
    /// </summary>
    [Route("car")]
    [ApiController]
    public class ShoppingCarController : ControllerBase
    {
        CSRedis.CSRedisClient _redis;
        /// <summary>
        /// 初始化值（构造函数）
        /// </summary>
        public ShoppingCarController()
        {
            //连接Redis服务器
            //Redis服务器地址默认是:127.0.0.1:6379
            //1、安装Nuget包：CSRedisCore
            //2、创建一个连接对象
            _redis = new CSRedis.CSRedisClient("127.0.0.1:6379");
        }

        /// <summary>
        /// 购物车的添加
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult Insert(ShoppingCarDto dto)
        {
            ResponseResultOutputDto responseResultOutputDto = new();
            //验证参数
            if (!ModelState.IsValid)
            {
                responseResultOutputDto.Code = Domain.Shared.ResponseResultStateCode.系统错误;
                responseResultOutputDto.Message = "参数无效";
                return BadRequest(responseResultOutputDto);
            }

            //业务处理（调用业务层）
            #region 业务处理
            //Redis存数据的格式是Key/Value
            string key = dto.MemberId;
            
            //添加之前，需要将缓存中的数据拿出来
            var data = _redis.Get<List<ShoppingCarDto>>(key);

            if (data == null)
            {
                data = new List<ShoppingCarDto>();
                data.Add(dto);
            }
            else
            {
                //判断要添加的商品，在集合（购物车）是否存在
                var model = data.Where(x => x.GoodsId.Equals(dto.GoodsId)).FirstOrDefault();
                
                //存在则数量累加，不存在，则放入集合
                if (model != null)
                {
                    model.GoodsNumber += dto.GoodsNumber;
                }
                else
                {
                    data.Add(dto);
                }
            }
            _redis.Set(key, data);

            #endregion


            //统一返回

            return Ok(responseResultOutputDto);
        }


        /// <summary>
        /// 删除购物车
        /// </summary>
        /// <param name="dtos"></param>
        /// <returns></returns>
        [HttpDelete]
        public IActionResult Detele(List<ShoppingCarDto> models)
        {
            ResponseResultOutputDto dto = new();
            if(models == null || models.Count <= 0)
            {
                dto.Code = Domain.Shared.ResponseResultStateCode.系统错误;
                dto.Message = "参数无效";
                return BadRequest(dto);
            }

            /*
             * 删除：是指删除购物车中的商品.
             * 所以，必须先拿出购物车中的数据
             */
            string key = models[0].MemberId;

            //所有要删除的数据，都在这个data里面
            var data = _redis.Get<List<ShoppingCarDto>>(key);

            models.ForEach(model => {
                var m = data.Where(x => x.GoodsId.Equals(model.GoodsId)).FirstOrDefault();
                if(m!=null)
                    data.Remove(m);
            });

            //删除完成后，需要更新缓存
            _redis.Set(key, data);

            return Ok(dto);
        }

        /// <summary>
        /// 修改购物车
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPut]
        public IActionResult Update(ShoppingCarDto model)
        {
            ResponseResultOutputDto dto = new();
            if (string.IsNullOrEmpty(model.GoodsId))
            {
                dto.Code = Domain.Shared.ResponseResultStateCode.系统错误;
                dto.Message = "参数无效";
                return BadRequest(dto);
            }
            /*
             * 修改：只修改购物车中的数据（不是修改数据库的数据）
             * 所以，需要把购物车的数据拿出来
             * **/

            string key = model.MemberId;
            
            //要修改的数据在data里面
            var data = _redis.Get<List<ShoppingCarDto>>(key);

            var m = data.Where(x => x.GoodsId.Equals(model.GoodsId)).FirstOrDefault();
            if(m!= null)
            {
                m.GoodsNumber = model.GoodsNumber;
            }

            //修改完成后记得更新到缓存
            _redis.Set(key, data);

            return Ok(dto);
        }

        /// <summary>
        /// 查询购物车
        /// </summary>
        /// <param name="memberId"></param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult Query(string memberId)
        {
            ResponseResultOutputDto dto = new();
            if (string.IsNullOrEmpty(memberId))
            {
                dto.Code = Domain.Shared.ResponseResultStateCode.系统错误;
                dto.Message = "参数无效";
                return BadRequest(dto);
            }

            string key = memberId;

            var data = _redis.Get<List<ShoppingCarDto>>(key);
            dto.Data = data;

            return Ok(dto);
        }

    }
}
